<?php
class ModelToolImage extends Model
{

        
        /*
        *功能：php完美实现下载远程图片保存到本地
        *参数：文件url,保存文件目录,保存文件名称，使用的下载方式
        *当保存文件名称为空时则使用远程文件原来的名称
        */
        public function getImage($url, $save_dir='', $filename='', $type=1)
        {
            if (trim($url)=='') {
                return array('file_name'=>'','save_path'=>'','error'=>1);
            }
            if (trim($save_dir)=='') {
                $save_dir='./';
            }
            if (trim($filename)=='') {//保存文件名
                $ext=strrchr($url, '.');
                if ($ext!='.gif'&&$ext!='.jpg') {
                    return array('file_name'=>'','save_path'=>'','error'=>3);
                }
                $filename=time().$ext;
            }
            if (0!==strrpos($save_dir, '/')) {
                $save_dir.='/';
            }
            //创建保存目录
            if (!file_exists($save_dir)&&!mkdir($save_dir, 0777, true)) {
                return array('file_name'=>'','save_path'=>'','error'=>5);
            }
            //获取远程文件所采用的方法
            if ($type) {
                $ch=curl_init();
                $timeout=5;
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
                $img=curl_exec($ch);
                curl_close($ch);
            } else {
                ob_start();
                readfile($url);
                $img=ob_get_contents();
                ob_end_clean();
            }
            //$size=strlen($img);
            //文件大小
            if (is_file($save_dir.$filename)) {
                unlink($save_dir . $filename);
            }
            $fp2=@fopen($save_dir.$filename, 'a');
            fwrite($fp2, $img);
            fclose($fp2);
            unset($img, $url);
            return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
        }
        
      
    public function resize($filename, $width, $height)
    {
        if (($filename == 'placeholder.png' && is_file(DIR_IMAGE . 'placeholder/placeholder.png')) || ($filename == 'no_image.png' && is_file(DIR_IMAGE . 'placeholder/no_image.png'))) {
            $filename = 'placeholder/' . $filename;
        }
            
        if (!is_file(DIR_IMAGE . $filename) || substr(str_replace('\\', '/', realpath(DIR_IMAGE . $filename)), 0, strlen(DIR_IMAGE)) != str_replace('\\', '/', DIR_IMAGE)) {
            return;
        }

        $extension = pathinfo($filename, PATHINFO_EXTENSION);

        $image_old = $filename;
        $image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;

        if (!is_file(DIR_IMAGE . $image_new) || (filemtime(DIR_IMAGE . $image_old) > filemtime(DIR_IMAGE . $image_new))) {
            list($width_orig, $height_orig, $image_type) = getimagesize(DIR_IMAGE . $image_old);

            if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
                return DIR_IMAGE . $image_old;
            }

            $path = '';

            $directories = explode('/', dirname($image_new));

            foreach ($directories as $directory) {
                $path = $path . '/' . $directory;

                if (!is_dir(DIR_IMAGE . $path)) {
                    @mkdir(DIR_IMAGE . $path, 0777);
                }
            }

            if ($width_orig != $width || $height_orig != $height) {
                $image = new Image(DIR_IMAGE . $image_old);
                $image->resize($width, $height);
                $image->save(DIR_IMAGE . $image_new);
            } else {
                copy(DIR_IMAGE . $image_old, DIR_IMAGE . $image_new);
            }
        }

        $image_new = str_replace(' ', '%20', $image_new);  // fix bug when attach image on email (gmail.com). it is automatic changing space " " to +

        if ($this->request->server['HTTPS']) {
            return $this->config->get('config_ssl') . 'image/' . $image_new;
        } else {
            return $this->config->get('config_url') . 'image/' . $image_new;
        }
    }
}
